﻿//
// Created by francklinson on 2021/4/1.
//

#ifndef CPPPRIMERPLUSREADINGCODES_TV_H
#define CPPPRIMERPLUSREADINGCODES_TV_H


// tv.h -- Tv and Remote classes
#ifndef TV_H_
#define TV_H_

class Tv
{
public:
    friend class Remote; // Remote can access Tv private parts
    enum
    {
        Off, On
    };
    enum
    {
        MinVal, MaxVal = 20
    };
    enum
    {
        Antenna, Cable
    };
    enum
    {
        TV, DVD
    };

    explicit Tv(int s = Off, int mc = 125) : state(s), volume(5),
                                             maxchannel(mc), channel(2), mode(Cable), input(TV)
    {}

    void onoff()
    { state = (state == On) ? Off : On; }

    bool ison() const
    { return state == On; }

    bool volup();

    bool voldown();

    void chanup();

    void chandown();

    void set_mode()
    { mode = (mode == Antenna) ? Cable : Antenna; }

    void set_input()
    { input = (input == TV) ? DVD : TV; }

    void settings() const; // display all settings
private:
    int state;      // on or off
    int volume;     // assumed to be digitized
    int maxchannel; // maximum number of channels
    int channel;    // current channel setting
    int mode;       // broadcast or cable
    int input;      // TV or DVD
};

class Remote
{
private:
    int mode;      // controls TV or DVD
public:
    explicit Remote(int m = Tv::TV) : mode(m)
    {}

    bool volup(Tv &t)
    { return t.volup(); }

    bool voldown(Tv &t)
    { return t.voldown(); }

    void onoff(Tv &t)
    { t.onoff(); }

    void chanup(Tv &t)
    { t.chanup(); }

    void chandown(Tv &t)
    { t.chandown(); }

    void set_chan(Tv &t, int c)
    { t.channel = c; }

    void set_mode(Tv &t)
    { t.set_mode(); }

    void set_input(Tv &t)
    { t.set_input(); }
};

#endif

#endif //CPPPRIMERPLUSREADINGCODES_TV_H
